parser grammar AnasintXML;

options {
  language = Java;
  tokenVocab = AnalexXML;
}

@header {
    package practica6;
}

@members {
     
     boolean reconoceAtributo = false;
     
     private ArrayList<RecognitionException> errors = new ArrayList<RecognitionException>();
     public ArrayList<RecognitionException> getErrors() {
        return errors;
     }
     @Override
     public void reportError (RecognitionException e) {
        String msg = getErrorMessage(e, getTokenNames());
        System.err.println(msg);
        errors.add(e);
     }
}


abrir_etiqueta: ABRIR_ET {reconoceAtributo = true;};

entrada: et_biblioteca libros* et_biblioteca_fin;

et_biblioteca: abrir_etiqueta BIBLIOTECA atributo? CERRAR_ET {reconoceAtributo = false;};
et_biblioteca_fin: FIN_ET BIBLIOTECA CERRAR_ET;

et_libro: abrir_etiqueta LIBRO atributo? CERRAR_ET {reconoceAtributo = false;};
et_libro_fin: FIN_ET LIBRO CERRAR_ET;

et_titulo: abrir_etiqueta TITULO atributo? CERRAR_ET {reconoceAtributo = false;};
et_titulo_fin: FIN_ET TITULO CERRAR_ET;

et_autor: abrir_etiqueta AUTOR atributo? CERRAR_ET {reconoceAtributo = false;};
et_autor_fin: FIN_ET AUTOR CERRAR_ET;

et_editorial: abrir_etiqueta EDITORIAL atributo? CERRAR_ET {reconoceAtributo = false;};
et_editorial_fin: FIN_ET EDITORIAL CERRAR_ET;

libros: et_libro contenido et_libro_fin;

contenido: titulo autor editorial;

titulo: et_titulo dentro_et et_titulo_fin;

autor: et_autor dentro_et et_autor_fin;

editorial: et_editorial dentro_et et_editorial_fin;

dentro_et: (PALABRAS|PUNTO)*;

atributo: {reconoceAtributo}? PALABRAS IGUAL CADENA;